package com.hardson.toolkit.util;

import java.awt.Component;
import java.awt.Font;
import java.io.BufferedInputStream;
import java.io.InputStream;

public class Fonts {

	public static final Font SONG20 = new Font("宋体", Font.PLAIN, 20);

	public static final Font SONG18 = new Font("宋体", Font.PLAIN, 18);

	public static final Font SONG16 = new Font("宋体", Font.PLAIN, 16);

	public static final Font SONG14 = new Font("宋体", Font.PLAIN, 14);

	public static final Font SONG12 = new Font("宋体", Font.PLAIN, 12);

	public static final Font DIALOG12 = new Font("Dialog", Font.PLAIN, 12);

	public static final Font YAHEI18 = new Font("微软雅黑", Font.PLAIN, 18);

	public static final Font YAHEI20 = new Font("微软雅黑", Font.PLAIN, 20);

	public static final Font YAHEI22 = new Font("微软雅黑", Font.PLAIN, 22);

	public static final Font YAHEI_LIGHT20 = new Font("微软雅黑 Light", Font.PLAIN, 20);

	private Fonts() {
	}

	/***
	 * 不改变字体的情况下加大或缩小字体大小，并设置字体风格
	 *
	 * @param font
	 * @param style
	 * @param num   字体加大值，如果为负数则字体缩小
	 * @return
	 */
	public static Font enlargeSize(final Font font, final int style, final int num) {
		return font.deriveFont(style, font.getSize() + num);
	}

	/***
	 * 不改变字体和风格的情况下加大或缩小字体大小
	 *
	 * @param font
	 * @param style
	 * @param num   字体加大值，如果为负数则字体缩小
	 * @return
	 */
	public static Font enlargeSize(final Font font, final int num) {
		return font.deriveFont(Float.valueOf(font.getSize() + num));
	}

	/**
	 * 不改变字体和风格的情况下加大或缩小组件字体大小
	 *
	 * @param comp
	 * @param num
	 */
	public static void enlargeSize(final Component comp, final int num) {
		Font font = enlargeSize(comp.getFont(), num);
		comp.setFont(font);
	}

	/**
	 * 不改变字体的情况下设置字体风格和大小
	 *
	 * @param font
	 * @param style
	 * @param fontSize
	 * @return
	 */
	public static Font styleAndSize(final Font font, final int style, final int fontSize) {
		return font.deriveFont(style, fontSize);
	}

	/**
	 * 不改变字体和风格的情况下设置字体大小
	 *
	 * @param font
	 * @param fontSize
	 * @return
	 */
	public static Font size(final Font font, final int fontSize) {
		return font.deriveFont(Float.valueOf(fontSize));
	}

	/**
	 * 将组件的字体设置为粗体
	 *
	 * @param comp
	 */
	public static Font bold(final Component comp) {
		Font font = comp.getFont().deriveFont(Font.BOLD);
		comp.setFont(font);
		return font;
	}

	/**
	 * 将组件的字体设置为平体
	 *
	 * @param comp
	 */
	public static Font plain(final Component comp) {
		Font font = comp.getFont().deriveFont(Font.PLAIN);
		comp.setFont(font);
		return font;
	}

	/**
	 * 从类路径中读取字体文件并返回其默认字体<br/>
	 * 类路径格式示例："/fonts/msyhl.ttc"
	 *
	 * @param classPath
	 * @return 字体文件的默认字体。如果字体文件没找到，返回空
	 */
	public static Font getDefinedFont(String classPath) {
		InputStream in = Fonts.class.getResourceAsStream(classPath);
		Font font = null;
		try (BufferedInputStream bis = new BufferedInputStream(in)) {
			font = Font.createFont(Font.TRUETYPE_FONT, bis);
		} catch (Exception e) {
			return null;
		}
		return font;
	}

	/**
	 * 从类路径中读取字体文件并返回自定义样式和大小的字体
	 *
	 * @param classPath
	 * @param style
	 * @param size
	 * @return 字体文件中的按样式和大小定义后的字体。如果没找到字体文件，返回按样式和大小定义的系统的宋体
	 */
	public static Font getDefinedFont(String classPath, int style, int size) {
		Font font = getDefinedFont(classPath);
		if (font == null) {
			return new Font("宋体", style, size);
		}
		return font.deriveFont(style, size);
	}
}
